#include "ModRunDecorator.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "../../Gof23/Gof_Decorator/Car.h"
#include "../../Gof23/Gof_Decorator/CarDecorator.h"
#include "../../Gof23/Gof_Decorator/CarDecoratorAutoMove.h"
#include "../../Gof23/Gof_Decorator/CarDecoratorFly.h"
#include "../../Gof23/Gof_Decorator/CarDecoratorSwim.h"

//装饰器模式的ModRun（Decorator）;
ModRunDecorator::ModRunDecorator()
{
    //模式名称;
    m_strModelName = "装饰器模式（Decorator）;";
    //模式描述;
    m_strModelDesc = "装饰器模式:在某些情况下我们会过度使用继承来扩展对象的功能，\r"
                     "由于继承为类型引入的静态特质，使得这种扩展方式缺乏灵活性；\n"
                     "并且随着子类的增多，各种子类的组合会导致子类的膨胀;\n"
                     "装饰器就是动态地给一个对象添加一些额外的功能，它是通过创建一个包装对象，\n"
                     "也就是装饰来包裹真实的对象。新增加功能来说，装饰器模式比生产子类更加灵活。\n\n"
                     "以下情形考虑使用装饰模式:\n"
                     "  需要扩展一个类的功能，或给一个类添加附加职责;\n"
                     "  需要动态的给一个对象添加功能，这些功能可以再动态的撤销;\n"
                     "  需要增加由一些基本功能的排列组合而产生的非常大量的功能，从而使继承关系变的不现实\n";
}

//初始化显示模式;
void ModRunDecorator::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunDecorator::GetEnum()
{
    return emModRunDecorator;
}

//运行模式;
void ModRunDecorator::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========装饰器模式 start:=======" };
        std::initializer_list<QString> outListSb{ "\n=========================\n" };
        std::initializer_list<QString> outListEnd{ "========装饰器模式 end:=======" };
        pOutPut->OutPut(outListStart);

        //装饰器模式;
        std::shared_ptr<Car> pCar(new Car());
        //车会移动;
        pCar->Move();

        pOutPut->OutPut(outListSb);
        //给车增加飞行功能;
        std::shared_ptr<CarDecoratorFly> pCarFly(new CarDecoratorFly(pCar));
        //车会飞;
        pCarFly->Move();

        pOutPut->OutPut(outListSb);
        //给车增加自动驾驶功能;
        std::shared_ptr<CarDecoratorAutoMove> pCarAutoMove(new CarDecoratorAutoMove(pCarFly));
        //车自动驾驶;
        pCarAutoMove->Move();

        pOutPut->OutPut(outListSb);
        //给车增加水上漂功能;
        std::shared_ptr<CarDecoratorSwim> pCarSwim(new CarDecoratorSwim(pCarAutoMove));
        //车水上漂;
        pCarSwim->Move();


        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunDecorator::CreateMe()
{
    return new ModRunDecorator();
}
